import {defineConfig, loadEnv} from "vite";
import {
    assertBool,
    buildConfig,
    createViteProxy,
    getRootPath,
    getServiceEnvConfig,
    getSrcPath,
    postcssPlugins
} from "./build";
import VitePlugin from "./build/plugins";
import {ImportMetaEnv} from "./build/typings/env";

/**
 * vite 相关配置 可以参考官网：https://vitejs.dev/config/
 */
export default defineConfig(configEnv => {
  const viteEnv = loadEnv(configEnv.mode, "./env") as unknown as ImportMetaEnv;
  const rootPath = getRootPath();
  const srcPath = getSrcPath();

  const isOpenProxy = assertBool(viteEnv.VITE_HTTP_PROXY);
  const envConfig = getServiceEnvConfig(viteEnv);

  return {
    base: viteEnv.VITE_BASE_URL,
    // 根据当前工作目录中的 `mode` 加载 .env 文件
    define: {
      // 设置第三个参数为 '' 来加载所有环境变量，而不管是否有 `VITE_` 前缀。
      "process.env": { ...process.env, ...viteEnv },
    },
    // 目录映射
    resolve: {
      alias: {
        "~": rootPath,
        "@": srcPath,
        "@components": `${srcPath}/components`,
        "@layouts": `${srcPath}/layouts`,
        "@utils": `${srcPath}/utils`,
        "@api": `${srcPath}/api`,
        "@styles": `${srcPath}/styles`,
      },
      // 在导入模块时，如果模块路径不包含文件扩展名，则会尝试添加下面这些扩展名
      extensions: [".js", ".mjs", ".ts", ".jsx", ".tsx", ".json", ".vue", ".css", ".less"],
    },
    plugins: new VitePlugin(viteEnv).setupPlugins(),
    // css配置
    css: {
      modules: {
        // 类名驼峰
        localsConvention: "camelCase",
      },
      // 预处理器的配置
      preprocessorOptions: {
        scss: {
          javascriptEnabled: true,
          // 这样就能全局使用 src/styles/global.scss 定义的 变量
          additionalData: `@use "./src/styles/scss/global.scss" as *;`,
        },
        requireModuleExtension: true,
      },
      postcss: {
        plugins: postcssPlugins,
      },
    },
    build: buildConfig(viteEnv),
    // 开发配置
    server: {
      // 端口号
      port: 5700,
      // 是否自动打开浏览器 在服务器启动时自动在浏览器中打开应用程序
      open: true,
      // 类型： boolean | CorsOptions 为开发服务器配置 CORS。默认启用并允许任何源
      cors: true,
      // IP配置，支持从IP启动
      host: "0.0.0.0",
      hmr: {
        // 禁用或配置 HMR 连接 设置 server.hmr.overlay 为 false 可以禁用服务器错误遮罩层
        overlay: false,
      },
      // 地址代理
      proxy: createViteProxy(isOpenProxy, envConfig),
    },
  };
});
